#include <iostream>
#include <vector>
#include <signal.h>
#include <unistd.h>

#define MAX_SIGNUM 31

// 要屏蔽的信号
// static std::vector<int> sigarr = {2, 3};
static std::vector<int> sigarr = {2};

static void show_pending(const sigset_t &pending)
{
    for (int signo = MAX_SIGNUM; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
            std::cout << "0";
    }
    std::cout << "\n";
}

static void myhandler(int signo)
{
    std::cout << signo << "号信号已经被递达！" << std::endl;
}

int main()
{
    for (const auto &sig : sigarr)
    {
        signal(sig, myhandler);
    }
    // 1. 先尝试屏蔽指定信号
    sigset_t block, oblock, pending;
    // 1.1 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);
    // 1.2 添加要屏蔽的信号
    for (const auto &sig : sigarr)
    {
        sigaddset(&block, sig);
    }
    // 1.3开始屏蔽，设置进内核（进程）
    sigprocmask(SIG_SETMASK, &block, &oblock);
    // 2. 遍历打印pending信号集
    int cnt = 5;
    while (true)
    {
        // 2.1初始化（可有可无，因为sigpending是覆盖式获取）
        sigemptyset(&pending);
        // 2.2获取pending信号集
        sigpending(&pending);
        // 2.3打印pending信号集
        show_pending(pending);
        if (cnt-- == 0)
        {
            // 恢复对信号的屏蔽
            std::cout << "恢复对信号的屏蔽，不屏蔽任何信号\n";
            sigprocmask(SIG_SETMASK, &oblock, &block);
            // 再次屏蔽信号
            sigprocmask(SIG_SETMASK, &block, &oblock);
            cnt = 5;
        }

        // 每隔一秒打印
        sleep(1);
    }
}
